/*
* INSANE - Interactive Structural Analysis Environment
*
* Copyright (C) 2003-2005
* Universidade Federal de Minas Gerais
* Escola de Engenharia
* Departamento de Engenharia de Estruturas
* 
* Author's email :    insane@dees.ufmg.br
* Author's website :  http://www.dees.ufmg.br/insane
* 
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
package br.ufmg.dees.insane.analysisModel;

import java.io.Serializable;

import br.ufmg.dees.insane.util.IMatrix;
import br.ufmg.dees.insane.util.IVector;
import br.ufmg.dees.insane.util.geometricProperties.GeometricProperties;

/**
*A class representing an analysis model of a FrameElement.
*
*@author Fonseca, Flavio & Pitangueira, Roque
*@version 1.1
*@since September 2003, modified October 2006
*/
public abstract class FrameElmAnalysis implements AnalysisModel, Serializable {
	
	/**
	 * Returns the local stiffness matrix for the type of FrameAnalysisModel.
	 * @param gp The GeometricProperties object for the element.
	 * @return The local stiffness matrix for the type of FrameAnalysisModel.
	 */
	public abstract IMatrix getLocalStiffnessMatrix(double[] properties);
	
	/** Returns the nodal rotation matrix of the specified FrameElement, accordingly to this AnalysisModel type.
	*@param angle1 The angle of the initial node.
	*@param angle2 The angle of the final node.
	*@return The nodal rotation matrix of the specified FrameElement, accordingly to this AnalysisModel type.
	*/
	public abstract IMatrix nodalRotationMatrix(double angle1, double angle2);
	
	/** Returns the Internal Variable Operator matrix related to 
	 * analysis model type (Ex: matrix B)
	*@param d The matrix containing local derivates of shape functions.
	*@param d2 The matrix containing local second derivates of shape functions.
	*@param d3 The matrix containing local third derivates of shape functions.
	*@param n The vector containing shape functions in natural coordinates.
	*@param c The matrix containing nodal coordinates in cartesian system.
	*@return The matrix representing the transformation between internal variable and state variable (B) 
	*/
	public abstract IMatrix getInternalVariableOperator(IMatrix d, IMatrix d2, IMatrix d3, IVector n, IMatrix c);
	
	public IMatrix modifyInternalVariableOperator(IMatrix e, IMatrix p) {
		// TODO Auto-generated method stub
		return null;
	}

	public IMatrix modifyDualInternalVariableOperator(IMatrix e, GeometricProperties gps) {
		// TODO Auto-generated method stub
		return null;
	}
	
	public IVector modifyDualInternalVariableVector(IVector s, GeometricProperties gps) {
		// TODO Auto-generated method stub
		return null;
	}

	public IMatrix getGeometricOperator(IVector n1) {
		// TODO Auto-generated method stub
		return null;
	}

//	public IVector getInternalVariablesVector(IVector a, IMatrix b) {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	public IVector getDualInternalVariablesVector(IVector a, IMatrix b) {
//		// TODO Auto-generated method stub
//		return null;
//	}

	public IMatrix getInternalVariablesTensor(IVector a, IMatrix b) {
		// TODO Auto-generated method stub
		return null;
	}

	public IMatrix getDualInternalVariablesTensor(IVector a, IMatrix b) {
		// TODO Auto-generated method stub
		return null;
	}

	public IVector expandVector(IVector a) {
		// TODO Auto-generated method stub
		return null;
	}

	public IMatrix expandTensor(IVector a) {
		// TODO Auto-generated method stub
		return null;
	}

	public IVector reduceVector(IVector a) {
		// TODO Auto-generated method stub
		return null;
	}

	public IVector reduceTensor(IMatrix a) {
		// TODO Auto-generated method stub
		return null;
	}

	public int getDominion() {
		// TODO Auto-generated method stub
		return 0;
	}

	public double getIntegrationFactor(IVector n, IMatrix cN, GeometricProperties gps) {
		// TODO Auto-generated method stub
		return 0;
	}

	public double getJacobianTransformation(IMatrix dl, IMatrix cN) {
		// TODO Auto-generated method stub
		return 0;
	}

	public double getJ2(IVector s) {
		// TODO Auto-generated method stub
		return 0;
	}

	public IVector getdJ2dSIG(IVector s) {
		// TODO Auto-generated method stub
		return null;
	}

	public double getJ3(IVector s) {
		// TODO Auto-generated method stub
		return 0;
	}

	public IVector getdJ3dSIG(IVector s) {
		// TODO Auto-generated method stub
		return null;
	}

	public double getI1(IVector s) {
		// TODO Auto-generated method stub
		return 0;
	}

	public IVector getdI1dSIG(IVector s) {
		// TODO Auto-generated method stub
		return null;
	}

	public double getI2(IVector s) {
		// TODO Auto-generated method stub
		return 0;
	}

	public IVector getdI2dSIG(IVector s) {
		// TODO Auto-generated method stub
		return null;
	}

	public double getI3(IVector s) {
		// TODO Auto-generated method stub
		return 0;
	}

	public IVector getdI3dSIG(IVector s) {
		// TODO Auto-generated method stub
		return null;
	}
	
}
